package jobs

import (
	"context"
	"cronjob_work/internal/model/entity"
	"encoding/json"
	"fmt"
	"github.com/gogf/gf/v2/frame/g"
	"os/exec"
	"time"
)

func InitJobsEtcd(ctx context.Context, data map[string][]byte) error {
	for _, v := range data {
		TaskToJob(ctx, v)
	}

	return nil
}

//func TaskToJobNoJson(ctx context.Context, task *entity.PpTask) error {
//	if task.CronSpec != "" {
//		myjobs, err := NewJobFromTask(ctx, task)
//		if err != nil {
//			g.Log().Error(ctx, "InitJobs:", err.Error())
//			return err
//		}
//
//		for _, job := range myjobs {
//			AddJob(ctx, task.CronSpec, job)
//		}
//	}
//
//	return nil
//}

func TaskToJob(ctx context.Context, data []byte) error {
	var task *entity.PpTask
	if err := json.Unmarshal(data, &task); err != nil {
		return err
	}

	if task != nil && task.CronSpec != "" {
		myjobs, err := NewJobFromTask(ctx, task)
		if err != nil {
			g.Log().Error(ctx, "InitJobs:", err.Error())
			return err
		}

		for _, job := range myjobs {
			AddJob(ctx, task.CronSpec, job)
		}
	}

	return nil
}

//func InitJobs(ctx context.Context) {
//	list, _ := service.Task().TaskGetList(ctx, 1, 1000000, "status", 1)
//	for _, task := range list {
//		jobs, err := NewJobFromTask(ctx, task)
//		if err != nil {
//			g.Log().Error(ctx, "InitJobs:", err.Error())
//			continue
//		}
//
//		for _, job := range jobs {
//			AddJob(ctx, task.CronSpec, job)
//		}
//	}
//}

func runCmdWithTimeout(ctx context.Context, cmd *exec.Cmd, timeout time.Duration) (error, bool) {
	done := make(chan error)
	go func() {
		done <- cmd.Wait()
	}()

	var err error
	select {
	case <-time.After(timeout):
		g.Log().Warning(ctx, fmt.Sprintf("任务执行时间超过%d秒，进程将被强制杀掉: %d", int(timeout/time.Second), cmd.Process.Pid))
		go func() {
			<-done // 读出上面的goroutine数据，避免阻塞导致无法退出
		}()
		if err = cmd.Process.Kill(); err != nil {
			g.Log().Error(ctx, fmt.Sprintf("进程无法杀掉: %d, 错误信息: %s", cmd.Process.Pid, err))
		}
		return err, true
	case err = <-done:
		return err, false
	}
}
